/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: YKH
 * Date: 2022-04-05
 * Time: 12:29
 */
//线程中断 : 使用 interrupt() 方法改变 线程中的 isInterrupted（）标记位
public class Test02 {
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                //isInterrupted() 相当于线程状态的一个标记位，默认是为 false
                while(!Thread.currentThread().isInterrupted() ) {
                    System.out.println("多线程执行");
                    try {
                        Thread.sleep( 1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        //此处加上break ，保证如果外面的 t.interrupt() 方法如果触发时，线程处于休眠状态，也能中断线程
                        break;
                    }
                }
            }
        } );
        t.start();
        //在主线程中通过 t.interrupted() 设置改变标记位
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t.interrupt();
        //此处使用 interrupt() 方法会遇到两种情况
        //1. 触发时，t线程正在运行状态， interrupt() 方法正确的修改了标记位，线程中断
        //2. 触发时，t线程处于 sleep、wait等状态，此时 nterrupt()方法 中断sleep状态
        //   此时会抛出异常，但线程的标记位并未被修改，线程未终止，要令线程在这种状况下也
        //   正常终止，需要在抛出异常时+个break，跳出循环，终止线程
    }
}
